package controllers

import play._
import play.mvc._

import models._
import dao.UserDAO

object Application extends Controller {
    
    import views.Application._
    import config.Services._
    
    /**
     * Procesar y mostrar la página principal
     * GET /
     */
    def index = {
      if(session("username").isDefined){
        User.panel
      } else {
        html.index()
      }
    }
    
    /**
     * Mostrar la página autónoma de inicio de sesión.
     * GET /login
     */
    def login = {
      <div>login page</div>
    }
    
    /**
     * Procesar y mostrar la sección del mapa
     * GET /map
     */
    def mapa = {
      if(User.isLogedIn){
        html.mapa(session("username"), User.getPreferences)
      } else {
        html.mapa(pref=models.User.getDefaultPreferences)
      }
    }
    
    /**
     * Procesar la identificación del usuario y almacenar los detalles en la cookie de sesión.
     * @arg username nombre del usuario
     * @arg password contraseña.
     * POST /login
     */
    def loginSubmit(username:String, password:String) = {
    using(dbSession){ s =>
      UserDAO.login(username, password) match {
        case Some(user)   => {
          
          // permitir la entrada sólo de usuarios activos
          if(user.status.id == Status.ACTIVE.id){
            val pref:models.User.Preferences = user.pref.getOrElse(models.User.getDefaultPreferences)
            session.clear()
            session.put("username", user.name)
            session.put("userfont", pref.fontSize)
            session.put("usertheme", pref.themeName)
            htmlGreetAndRedirect(user.fullname)
          } else {
            Forbidden
          }
          
        }
        case None         => {
          htmlError("Contraseña o usuario incorrectos")
        }
      }
    }
  }
  
  def recoverByMail(username:Option[String], userrealname:Option[String], usermail:String) = "by mail"
  
  def recoverByPhone(username:Option[String], userrealname:Option[String], userphone:String) = "by phone"
  
  def recoverByAttachment(username:Option[String], userrealname:Option[String], attachment:Option[java.io.File]) = "by file"
  
  def recoverByCustomerSupport = "by customer support"
    
  def register(usershortname:String, userfullname:String, userpass:String, usermail:String) = {
    using(dbSession){ s =>
      UserDAO.findByName(usershortname) match {
        case Some(user)   => htmlError("El usuario " + usershortname + " ya está en uso. <br /> Intente usar otro nombre.")
        case None         => {
          UserDAO.createAndRef(usershortname, userfullname, userpass, "", None, None) match {
            case Some(user)   => loginSubmit(usershortname, userpass)
            case None         => htmlError("No se pudo crear su cuenta.<br />Intente más tarde.")
          }
        }
      }
    }
    
  }
  
  private def htmlError(msg:String) = <p class="fancy-error">{msg}</p>
  
  private def htmlGreetAndRedirect(name:String) = {
    <span>
      <p>Bienvenido <strong>{name}</strong></p>
      <p><em>redireccionando...</em></p>
      <script>
        window.location.replace('/panel')
      </script>
    </span>
  }
  
}
